home *** CD-ROM | disk | FTP | other *** search
- /* DrawBits.c
- **
- ** Copyright 1995, mFactory, Inc.
- ** All rights reserved.
- */
-
- #include "DrawBits.h"
-
- #define kApplyPopup 6 // DITL indices
- #define kRemovePopup 8
-
- static MErr CompDrawBuffered(DrawBitsComp *self, PLUpdateSpec *drawSpec, PLOffScreenSpec *gworldSpec);
-
-
- /* Initial entry point
- */
-
- MCompMainFuncDcl MCompMainName(MInitInfo *initInfo)
- {
- MDefineComponent(DrawBitsComp, kMCanDragOff);
- MInheritClass(MComponent, kMCompNumProcs, kMBaseCompSlot);
-
- // MComponent methods we must override
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompConstructor, MCompConstructor);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompCopy, MCompCopy);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompCopyConstructor, MCompCopyConstructor);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompDestructor, MCompDestructor);
-
- // MComponent methods we choose to override
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEditorOpen, MCompEditorOpen);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEditorAccept, MCompEditorAccept);
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompGetSaveInfo, MCompGetSaveInfo);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompSaveComponent, MCompSaveComponent);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompRestoreComponent, MCompRestoreComponent);
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompEnabled, MCompEnabled);
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompDisabled, MCompDisabled);
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompApplyEditorEffect, MCompApplyEditorEffect);
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompProcessMessage, MCompProcessMessage);
-
- MDefineMethod(kDrawBitsSlot, kMBaseCompSlot, kMCompAdaptIDs, MCompAdaptIDs);
-
- // Introduce our own methods
-
- MDefineMethod(kDrawBitsSlot, kDrawBitsSlot, kDrawBuffered, CompDrawBuffered);
-
- MConnectCommonServices(initInfo);
-
- MEndComponentDef;
- }
-
-
- /* Initialize component
- */
-
- static MErr MCompConstructor(DrawBitsComp *self, MObjectRef *mRef)
- {
- MInitEvent(self->f_applyEvent, kMParentEnabled, 0);
- MInitEvent(self->f_removeEvent, kMNone, 0);
- return kMNoCompErr;
- }
-
-
- /* Copy component data
- */
-
- static MErr MCompCopy(DrawBitsComp *self, DrawBitsComp *previousSelf)
- {
- MCopyEvent(self->f_applyEvent, previousSelf->f_applyEvent);
- MCopyEvent(self->f_removeEvent, previousSelf->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Copy component
- */
-
- static MErr MCompCopyConstructor(DrawBitsComp *self, DrawBitsComp *previousSelf, MObjectRef *mRef)
- {
- MCompConstructor(self, mRef);
- return MCompCopy(self, previousSelf);
- }
-
-
- /* Dispose component
- */
-
- static MErr MCompDestructor(DrawBitsComp *self)
- {
- MDisposeEvent(self->f_applyEvent);
- MDisposeEvent(self->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Open component dialog
- */
-
- static MErr MCompEditorOpen(DrawBitsComp *self, void *editor, short editorType)
- {
- if ( editorType == kMDialogEditorType ) {
- MSetEditorItem(editor, kApplyPopup, (MDataType *) &self->f_applyEvent);
- MSetEditorItem(editor, kRemovePopup, (MDataType *) &self->f_removeEvent);
- return kMNoCompErr;
- }
- else
- return kMUnableToComplyCompErr;
- }
-
-
- /* Close component dialog
- */
-
- static MErr MCompEditorAccept(DrawBitsComp *self, void *editor)
- {
- MGetEditorItem(editor, kApplyPopup, (MDataType *) &self->f_applyEvent);
- MGetEditorItem(editor, kRemovePopup, (MDataType *) &self->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Provide save information
- */
-
- static MErr MCompGetSaveInfo(DrawBitsComp *self, MFileIOServ *file, long saveInfo, short *rev, long *len)
- {
- long valueSize;
-
- MSizeOfValue(file, &self->f_applyEvent, &valueSize);
- *len = valueSize;
- MSizeOfValue(file, &self->f_removeEvent, &valueSize);
- *len += valueSize;
-
- *rev = kDrawBitsRev;
- return kMNoCompErr;
- }
-
-
- /* Save component
- */
-
- static MErr MCompSaveComponent(DrawBitsComp *self, MFileIOServ *file, long saveInfo)
- {
- MWriteValue(file, &self->f_applyEvent);
- MWriteValue(file, &self->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Restore component
- */
-
- static MErr MCompRestoreComponent(DrawBitsComp *self, MFileIOServ *file ,long saveInfo, short rev)
- {
- if ( rev == kDrawBitsRev ) {
- MReadValue(file, &self->f_applyEvent);
- MReadValue(file, &self->f_removeEvent);
- return kMNoCompErr;
- }
- else
- return kMUnableToComplyCompErr;
- }
-
-
- /* Enable drawing in edit mode
- */
-
- static MErr MCompApplyEditorEffect(DrawBitsComp *self)
- {
- if ( MDefaultMessage(self->f_applyEvent) ) {
- MObjectRef *element;
- MFunk funk;
- MInteger mInt;
-
- MGetElement(&element);
- MInitFunk(funk, kMBufferedDrawFunk, self, kDrawBitsSlot, kDrawBuffered, 0, 0, 0);
- MInitInteger(mInt, 0);
- MRegisterFunk(element, &funk, (MDataType *) &mInt);
- }
- return kMNoCompErr;
- }
-
-
- /* Component enabled in runtime
- */
-
- static MErr MCompEnabled(DrawBitsComp *self)
- {
- MRegisterMouseFeedback(self, &self->f_applyEvent);
- MRegisterMouseFeedback(self, &self->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Component disabled in runtime
- */
-
- static MErr MCompDisabled(DrawBitsComp *self)
- {
- MDeregisterMouseFeedback(self, &self->f_applyEvent);
- MDeregisterMouseFeedback(self, &self->f_removeEvent);
- return kMNoCompErr;
- }
-
-
- /* Process incoming message
- */
-
- static MErr MCompProcessMessage(DrawBitsComp *self, MMessagePtr message)
- {
- if ( MDetectMessage(message, self->f_applyEvent) ) {
- MFunk funk;
- MObjectRef *element;
- MDataType d;
-
- MInitFunk(funk, kMBufferedDrawFunk, self, kDrawBitsSlot, kDrawBuffered,0,0,0);
- MInitInteger(d.f_integer, 0);
- MGetElement(&element);
- MRegisterFunk(element, &funk, &d);
- return kMNoCompErr;
- }
- else if ( MDetectMessage(message, self->f_removeEvent) || MDetectDisableMessage(message) ) {
- MObjectRef *element;
-
- MGetElement(&element);
- MUnregisterFunk(element, kMBufferedDrawFunk);
- return kMNoCompErr;
- }
- else
- return kMUnableToComplyCompErr;
- }
-
-
- /* Draw bits on element
- */
-
- static MErr CompDrawBuffered(DrawBitsComp *self, PLUpdateSpec *drawSpec, PLOffScreenSpec *gworldSpec)
- {
- long width = drawSpec->f_mediaRect->right - drawSpec->f_mediaRect->left;
- long height = drawSpec->f_mediaRect->bottom - drawSpec->f_mediaRect->top;
- long i, j;
-
- #ifdef _Macintosh_
- Byte *rawBits = ((Byte *) gworldSpec->f_imageBits) +
- (long) drawSpec->f_mediaRect->top * gworldSpec->f_rowBytes +
- drawSpec->f_mediaRect->left;
-
- Byte *maxPixelsAddr = ((Byte *) gworldSpec->f_imageBits) +
- (long)(gworldSpec->f_surfaceRect.bottom - gworldSpec->f_surfaceRect.top) *
- gworldSpec->f_rowBytes;
- #elif _Windows_
- Byte __huge *rawBits = ((Byte __huge *) gworldSpec->f_imageBits) +
- (long) drawSpec->f_mediaRect->top * gworldSpec->f_rowBytes +
- drawSpec->f_mediaRect->left;
-
- Byte __huge *maxPixelsAddr = ((Byte __huge *) gworldSpec->f_imageBits) +
- (long) (gworldSpec->f_surfaceRect.bottom - gworldSpec->f_surfaceRect.top) *
- gworldSpec->f_rowBytes;
- #endif
-
- for (j=0; j<height; j++) {
- for (i=0; i<width; i++) {
- if ( (&rawBits[i] <= maxPixelsAddr) && (&rawBits[i] >= (Byte *)gworldSpec->f_imageBits) )
- rawBits[i] = rawBits[i]+10;
- }
- rawBits += gworldSpec->f_rowBytes;
- }
- return kMNoCompErr;
- }
-
-
- /* Adjust project-specific IDs
- */
-
- static MErr MCompAdaptIDs(DrawBitsComp *self, MObjectPtr *sourceStore, MObjectPtr *targetStore)
- {
- MTranslateID(kMTranslateEventID, sourceStore, targetStore, (MDataType *) &self->f_applyEvent);
- MTranslateID(kMTranslateEventID, sourceStore, targetStore, (MDataType *) &self->f_removeEvent);
- return kMNoCompErr;
- }
-